package com.wjm.until;

import org.apache.commons.dbcp.BasicDataSource;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Data:2022年09月11日
 * Author:wjm
 * Content: DBCP连接池
 *
 *      1. 创建数据库连接池对象：
 *
 *            BasicDataSource ds = new BasicDataSource(); //dbcp创建连接池对象
 *
 *
 *       2. 给连接池对象设置必要参数：
 *
 *            ds.setDriverClassName(String driver);  //设置驱动
 *            ds.setUrl(String url)                  //设置连接路径
 *            ds.setUsername(String username);       //设置用户名
 *            ds.setPassword(String password);       //设置密码
 *            ds.setInitialSize(int size);           //设置初始化连接数
 *            ds.setMaxActive(int maxSize);          //设置最大的可连接数
 *
 *
 *       3. 从数据库连接池中获取连接对象：
 *
 *            Connection connection = ds.getConnection();
 *
 *
 */
public class DBCPUtil {
    //连接池对象
    public static BasicDataSource basicDataSource;

    /**
     * 从配置文件中加载url，user，password,driver等···
     * 并给连接池对象设置必要参数
     */
    static {
        try {
            //获取输入流
            InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("DBCPUtil.properties");

            Properties properties = new Properties();
            //通过io流将读取的数据加载到Properties对象中
            properties.load(in);

            //通过properties对象获取数据
            String url = properties.getProperty("jdbc.url");
            String user = properties.getProperty("jdbc.user");
            String password = properties.getProperty("jdbc.password");
            String driver = properties.getProperty("jdbc.driver");
            String initialSize = properties.getProperty("jdbc.initialSize");
            String maxSize = properties.getProperty("jdbc.maxSize");

            //创建连接池对象
            basicDataSource = new BasicDataSource();

            //给连接池对象设置必要参数
            basicDataSource.setDriverClassName(driver);
            basicDataSource.setUrl(url);
            basicDataSource.setUsername(user);
            basicDataSource.setPassword(password);
            basicDataSource.setInitialSize(Integer.valueOf(initialSize));
            basicDataSource.setMaxActive(Integer.valueOf(maxSize));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 从连接池获取连接的方法
     * @return 返回连接对象
     */
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = basicDataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return connection;
    }


    /**
     * 将连接对象归还给连接池
     * @param connection
     */
    public static void close(Connection connection){
        try {
            connection.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }


    /**
     * 释放资源的方法
     * @param connection 归还连接对象
     * @param statement  关闭执行计划
     * @param resultSet  清空结果集
     */
    public static void close(Connection connection, Statement statement, ResultSet resultSet){
        try {
            connection.close();
            statement.close();
            resultSet.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }



}
